package iut2.sponsor.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.DecoratedStackPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;
import com.google.gwt.user.client.ui.VerticalPanel;

/**
 * Classe gerant l'affichage du menu du site
 *
 */
public class Menu extends VerticalPanel implements ValueChangeHandler<String> {

	/**
	 * StackPanel contenant tous les elements du menu
	 */
	private DecoratedStackPanel menuPanel = new DecoratedStackPanel();
	/**
	 * Tree contenant tous les elements du sous menu "Sponsors"
	 */
	private Tree          sponsorTree = new Tree();
	/**
	 * Tree contenant tous les elements du sous menu "Flyer"
	 */
	private Tree          flyerTree   = new Tree();
	/**
	 * Contenu de la section contenant les progressbars au dessus du menu
	 */
	private final VerticalPanel panelRecolte = new VerticalPanel();
	
	/**
	 * Langue courante de l'application
	 */
	private static final Lang lang    = (Lang) GWT.create(Lang.class);
	
	/**
	 * ImageBundle de l'application
	 */
	private JoyeuseImageBundle imB = Iut2sponsor.SINGLETON.getImB(); 
	
	/**
	 * Grille contenant les drapeaux pour l'internationalization
	 */
	private final Grid gridInt = new Grid(1,3);
	/**
	 * Icone du drapeau francais
	 */
	private Image drapFr   = imB.fr().createImage();	
	/**
	 * Icone du drapeau anglais
	 */
	private Image drapEng  = imB.eng().createImage();	
	/**
	 * Icone du drapeau italien
	 */
	private Image drapIt   = imB.it().createImage();	
	/**
	 * Icone du drapeau francais en rollover
	 */
	private Image drapFr2  = imB.fr2().createImage();	
	/**
	 * Icone du drapeau anglais en rollover
	 */
	private Image drapEng2 = imB.eng2().createImage();	
	/**
	 * Icone du drapeau italien en rollover
	 */
	private Image drapIt2  = imB.it2().createImage();	


	/**
	 * Constructeur mettant en place tous les composants du menu et initialisant la gestion de l'historique
	 */
	public Menu() {
		this.setHeight("300px");
		this.setStyleName("menu");
		this.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		
		panelRecolte.addStyleName("recolte");

		//mise a jour des progressbar
		MAJPanelRecolte();

		this.add(panelRecolte);

		menuPanel.setWidth("200px");
		menuPanel.setHeight("200px");

		//creation de la liste des liens du sous menu "Sponsors"
		TreeItem it = null;
		it = new TreeItem(imB.sponsorlist().getHTML() + " " + lang.listSp());
		it.setTitle("Liste_Sponsors");
		sponsorTree.addItem(it);
		it = new TreeItem(imB.lots().getHTML() + " " + lang.lotsRecoltes());
		it.setTitle("Lots_Recoltes");
		sponsorTree.addItem(it);
		it = new TreeItem(imB.montants().getHTML() + " " + lang.montRecoltes());
		it.setTitle("Montants_Recoltes");
		sponsorTree.addItem(it);
		it = new TreeItem(imB.ajoutsp().getHTML() + " " + lang.ajoutSp());
		it.setTitle("Ajouter_Sponsor");
		sponsorTree.addItem(it);

		//on realise un abonnement pour pouvoir gerer les evenements lors d'un clic sur un element de l'arbre
		sponsorTree.addSelectionHandler(new SelectionHandler<TreeItem>() {
			@Override
			public void onSelection(SelectionEvent<TreeItem> event) {
				History.newItem(event.getSelectedItem().getTitle());
			}
		});

		//ajout du sous menu "Sponsors"
		HorizontalPanel panSponsor = new HorizontalPanel();
		panSponsor.add(imB.sponsors().createImage());
		panSponsor.add(new HTML("<p class=\"gros\">" + lang.sp() + "</p>"));
		menuPanel.add(sponsorTree,panSponsor.getElement().getString(), true);

		//creation de la liste des liens du sous menu "Flyer"
		it = new TreeItem(imB.flyer2().getHTML() + " " + lang.voirFlyer());
		it.setTitle("Voir_Flyer");
		flyerTree.addItem(it);
		flyerTree.addSelectionHandler(new SelectionHandler<TreeItem>() {
			@Override
			public void onSelection(SelectionEvent<TreeItem> event) {
				History.newItem(event.getSelectedItem().getTitle());
			}
		});

		//ajout du sous menu "Flyer"
		HorizontalPanel panFlyer = new HorizontalPanel();
		panFlyer.add(imB.flyer().createImage());
		panFlyer.add(new HTML("<p class=\"gros\">" + lang.flyer() + "</p>"));
		menuPanel.add(flyerTree,panFlyer.getElement().getString(), true);

		//ajout du sous menu "Equipe"
		HorizontalPanel panTree = new HorizontalPanel();
		panTree.add(imB.team().createImage());
		panTree.add(new HTML("<p class=\"gros\">" + lang.equipe() + "</p>"));
		menuPanel.add(createContactsItem(),panTree.getElement().getString(), true);

		this.add(menuPanel);
		
		//ajout des drapeaux pour l'internationalization
		drapFr.addStyleName("curseur");
		drapFr2.addStyleName("curseur");
		drapEng.addStyleName("curseur");
		drapEng2.addStyleName("curseur");
		drapIt.addStyleName("curseur");
		drapIt2.addStyleName("curseur");
		
		//ajout des handlers pour les evenements des drapeaux
		drapFr2.addMouseOverHandler(new MouseOverHandler() {
			@Override
			public void onMouseOver(MouseOverEvent event) {
				gridInt.setWidget(0,0,drapFr);
		}});
		drapFr.addMouseOutHandler(new MouseOutHandler() {
			@Override
			public void onMouseOut(MouseOutEvent event) {
				gridInt.setWidget(0,0,drapFr2);
		}});
		drapFr.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				//passage en français
				Window.Location.replace("?locale=fr" + Window.Location.getHash());
			}
		});
		drapEng2.addMouseOverHandler(new MouseOverHandler() {
			@Override
			public void onMouseOver(MouseOverEvent event) {
				gridInt.setWidget(0,1,drapEng);
		}});
		drapEng.addMouseOutHandler(new MouseOutHandler() {
			@Override
			public void onMouseOut(MouseOutEvent event) {
				gridInt.setWidget(0,1,drapEng2);
		}});
		drapEng.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				//passage en anglais
				Window.Location.replace("?locale=en" + Window.Location.getHash());
			}
		});
		drapIt2.addMouseOverHandler(new MouseOverHandler() {
			@Override
			public void onMouseOver(MouseOverEvent event) {
				gridInt.setWidget(0,2,drapIt);
		}});
		drapIt.addMouseOutHandler(new MouseOutHandler() {
			@Override
			public void onMouseOut(MouseOutEvent event) {
				gridInt.setWidget(0,2,drapIt2);
		}});
		drapIt.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				//passage en italien
				Window.Location.replace("?locale=it" + Window.Location.getHash());
			}
		});
		//ajout des drapeaux sous le menu
		gridInt.setWidget(0,0,drapFr2);
		gridInt.setWidget(0,1,drapEng2);
		gridInt.setWidget(0,2,drapIt2);
		this.add(gridInt);

		// Abonnement du recepteur a l'historique
		History.addValueChangeHandler(this);

		// declenchement de l'etat initial de l'historique
		History.fireCurrentHistoryState();
	}

	/**
	 * Creation de la liste des contacts dans le sous menu "Equipe" de l'application
	 * @return le panel contenant la liste des contacts du sous menu "Equipe"
	 */
	private VerticalPanel createContactsItem() {
		

		//creation de la liste des contacts
		VerticalPanel contactsPanel = new VerticalPanel();
		contactsPanel.setSpacing(4);

		contactsPanel.add(createContact("Mickael",
				"mickael.micallef@iut2.upmf-grenoble.fr", contactsPanel));
		contactsPanel.add(createContact("Pierre-Yves",
				"pierre-yves.berger-sabbatel@iut2.upmf-grenoble.fr",contactsPanel));

		return contactsPanel;
	}

	/**
	 * Creation d'un element contact dans le sous menu "Equipe" de l'application, avec le popup qui s'affiche quand on le clique
	 * @param name nom du contact
	 * @param address adresse email du contact
	 * @param contactsPanel panel dans lequel la liste des contacts est affiche
	 * @return l'html correspondant a un contact et au popup affiche lors d'un clic
	 */
	private HTML createContact(final String name,final String address,VerticalPanel contactsPanel) {
		//on cree le popup
		HorizontalPanel contactPopupContainer = new HorizontalPanel();
		final HTML contactInfo = new HTML();
		HorizontalPanel contactInfoPanel = new HorizontalPanel();
		contactInfoPanel.add(imB.mail().createImage());
		contactInfoPanel.add(contactInfo);
		contactPopupContainer.add(contactInfoPanel);
		final PopupPanel contactPopup = new PopupPanel(true, false);
		contactPopup.setWidget(contactPopupContainer);
		
		final HTML contactLink = new HTML("<a href=\"javascript:undefined;\">" + name + "</a>");
		contactsPanel.add(contactLink);

		contactLink.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				//on ajoute les infos du contact
				contactInfo.setHTML(name + "<br /><i><a href=\"mailto:" + address + "\">" + address + "</a></i>");

				//on affiche le popup
				int left = contactLink.getAbsoluteLeft() + 50;
				int top = contactLink.getAbsoluteTop() + 18;
				contactPopup.setPopupPosition(left, top);
				contactPopup.show();
			}
		});
		return contactLink;
	}

	/**
	 * Raffraichissement de l'affichage du cadre avec les barres de progres dans le menu
	 * 
	 */
	public void MAJPanelRecolte() {
		panelRecolte.clear();
		HorizontalPanel pL = new HorizontalPanel();
		HorizontalPanel pM = new HorizontalPanel();

		panelRecolte.setWidth("180px");
		Label titre = new Label(lang.descResum());
		titre.setStyleName("centre");
		panelRecolte.add(titre);

		HTML contenu1 = new HTML("(" + lang.details() + ")");
		contenu1.setStyleName("curseur");
		contenu1.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				History.newItem("Lots_Recoltes");
			}
		});
		pL.add(new Label(lang.lotsInitial()));
		pL.add(VueLots.getProgress(20));
		pL.add(contenu1);

		HTML contenu2 = new HTML("(" + lang.details() + ")");
		contenu2.setStyleName("curseur");
		contenu2.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				History.newItem("Montants_Recoltes");
			}
		});
		pM.add(new Label("€"));
		pM.add(VueMontant.getProgress(20));
		pM.add(contenu2);

		panelRecolte.add(pL);
		panelRecolte.add(pM);
	}

	/**
	 * Affiche la vue correspondant a l'element selectionne du sous menu "Sponsors"
	 */
	public void selecSponsor() {
		TreeItem item = sponsorTree.getSelectedItem();
		if (item != null) {
			if (item.getHTML().contains(lang.listSp()))
				Iut2sponsor.SINGLETON.getContenu().afficherVueListeSponsor();
			else if (item.getHTML().contains(lang.ajoutSp()))
				Iut2sponsor.SINGLETON.getContenu().afficherVueAjoutSponsor();
			else if (item.getHTML().contains(lang.lotsRecoltes()))
				Iut2sponsor.SINGLETON.getContenu().afficherVueLots();
			else if (item.getHTML().contains(lang.montRecoltes()))
				Iut2sponsor.SINGLETON.getContenu().afficherVueMontants();
		}
	}
	
	/**
	 * Affiche la vue correspondant a l'element selectionne du sous menu "Flyer"
	 */
	public void selecFlyer() {
		if (flyerTree.getSelectedItem() != null) {
			Iut2sponsor.SINGLETON.getContenu().afficherVueFlyer();
		}
	}


	/**
	 * Gestion de l'historique
	 */
	@Override
	public void onValueChange(ValueChangeEvent<String> event) {
		TreeItem item = null;
		String token = event.getValue();

		for (int i = 0; i < sponsorTree.getItemCount(); i++) {
			if (sponsorTree.getItem(i).getTitle().equals(token))
				item = sponsorTree.getItem(i);
		}
		if (item != null) {
			sponsorTree.setSelectedItem(item);
			selecSponsor();
			menuPanel.showStack(0);
		}
		else
		{
			for (int i = 0; i < flyerTree.getItemCount(); i++) {
				if (flyerTree.getItem(i).getTitle().equals(token))
				{
					item = flyerTree.getItem(i);
				}
			}
			if (item != null) {
				flyerTree.setSelectedItem(item);
				selecFlyer();
				menuPanel.showStack(1);
			}
			else
			{
				if (Iut2sponsor.SINGLETON != null)
					if (Iut2sponsor.SINGLETON.getContenu() != null)
						Iut2sponsor.SINGLETON.getContenu().afficherVueAccueil();
			}
		}
	}
}
